package com.dc.member.service.impl;

import com.dc.base.BaseApiService;
import com.dc.base.BaseResponse;
import com.dc.core.bean.DCBeanUtils;
import com.dc.constant.Constants;
import com.dc.core.token.GenerateToken;
import com.dc.core.type.TypeCastHelper;
import com.dc.core.utils.MD5Util;
import com.dc.member.input.dto.UserLoginInpDTO;
import com.dc.member.mapper.UserMapper;
import com.dc.member.mapper.entity.UserDO;
import com.dc.member.output.dto.UserOutputDTO;
import com.dc.member.service.IMemberService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author: KEYD
 * @Date: 2019/12/25 17:08
 * @Desc: 会员服务的实现类
 */
@RestController
public class MemberServiceImpl extends BaseApiService<UserOutputDTO> implements IMemberService {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private GenerateToken generateToken;

    /**
     * 根据手机号判断用户是否存在
     *
     * @param mobile
     * @return
     */
    @Override
    public BaseResponse<UserOutputDTO> existMobile(@RequestParam("mobile") String mobile) {
        //1、验证参数
        if (StringUtils.isEmpty(mobile)) {
            return setResultError("手机号码不能为空");
        }
        //2、根据手机号码，查询用户信息。单独定义code，表示用户信息不存在
        UserDO userEntity = userMapper.existMobile(mobile);
        if (userEntity == null) {
            return setResultError(Constants.HTTP_RES_CODE_EXISTMOBILE_203, "用户信息不存在");
        }
        //对特殊敏感字段脱敏
        //3、将do 转换成 dto 输出
        UserOutputDTO userOutputDTO = DCBeanUtils.doToDto(userEntity, UserOutputDTO.class);
        return setResultSuccess(userOutputDTO);
    }

    /**
     * 根据token查看用户信息
     *
     * @param token
     * @return
     */
    @Override
    public BaseResponse<UserOutputDTO> getInfo(@RequestParam("token") String token) {
        //1、验证token参数
        if (StringUtils.isEmpty(token)) {
            return setResultError("token 不能为空");
        }
        //2、使用token查询redis中的userId
        String redisUserId = generateToken.getToken(token);
        if (StringUtils.isEmpty(redisUserId)) {
            return setResultError("token 已经失效，或者错误");
        }
        //3、使用userID查询数据库用户信息
        long userId = TypeCastHelper.toLong(redisUserId);
        UserDO userDO = userMapper.findByUserId(userId);
        if (userDO == null) {
            return setResultError("用户不存在");
        }
        //转换一下类型
        UserOutputDTO userOutputDTO = DCBeanUtils.doToDto(userDO, UserOutputDTO.class);
        return setResultSuccess(userOutputDTO);
    }

    @Override
    public BaseResponse<UserOutputDTO> ssoLogin(@RequestBody UserLoginInpDTO userLoginInpDTO) {
        // 1.验证参数
        String mobile = userLoginInpDTO.getMobile();
        System.out.println("dc-----" + userLoginInpDTO.toString());
        if (StringUtils.isEmpty(mobile)) {
            return setResultError("手机号码不能为空!");
        }
        String password = userLoginInpDTO.getPassword();
        if (StringUtils.isEmpty(password)) {
            return setResultError("密码不能为空!");
        }
        // 判断登陆类型
        String loginType = userLoginInpDTO.getLoginType();
        if (StringUtils.isEmpty(loginType)) {
            return setResultError("登陆类型不能为空!");
        }
        // 目的是限制范围
        if (!(loginType.equals(Constants.MEMBER_LOGIN_TYPE_ANDROID) || loginType.equals(Constants.MEMBER_LOGIN_TYPE_IOS)
                || loginType.equals(Constants.MEMBER_LOGIN_TYPE_PC))) {
            return setResultError("登陆类型出现错误!");
        }

        // 设备信息
        String deviceInfor = userLoginInpDTO.getDeviceInfor();
        if (StringUtils.isEmpty(deviceInfor)) {
            return setResultError("设备信息不能为空!");
        }
        // 2.对登陆密码实现加密
        String newPassWord = MD5Util.MD5(password);
        // 3.使用手机号码+密码查询数据库 ，判断用户是否存在
        UserDO userDo = userMapper.login(mobile, newPassWord);
        if (userDo == null) {
            return setResultError("用户名称或者密码错误!");
        }
        return setResultSuccess(DCBeanUtils.doToDto(userDo, UserOutputDTO.class));
    }
    //token存放在PC端是cookie  普通
    //在安卓和IOS端 存放本地文件夹中
    //当前的token存在的问题？用户退出和修改密码，忘记密码的情况下，对token状态进行标识
    //  百度账号Cookies购买，给的是令牌，不是账号。模拟别人登录，只能在一些模块上，加上短信验证码
    //token 如何防止伪造(不可能)，尽量防止别人抓不打。 xss注入 js获取

}
